// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include "Common/CommonTypes.h"

class PointerWrap;

namespace PowerPC
{
const u32 ICACHE_SETS = 128;
const u32 ICACHE_WAYS = 8;
// size of an instruction cache block in words
const u32 ICACHE_BLOCK_SIZE = 8;

const u32 ICACHE_EXRAM_BIT = 0x10000000;
const u32 ICACHE_VMEM_BIT = 0x20000000;

struct InstructionCache
{
  u32 data[ICACHE_SETS][ICACHE_WAYS][ICACHE_BLOCK_SIZE];
  u32 tags[ICACHE_SETS][ICACHE_WAYS];
  u32 plru[ICACHE_SETS];
  u32 valid[ICACHE_SETS];

  u32 way_from_valid[255];
  u32 way_from_plru[128];

  u8 lookup_table[1 << 20];
  u8 lookup_table_ex[1 << 21];
  u8 lookup_table_vmem[1 << 20];

  InstructionCache();
  u32 ReadInstruction(u32 addr);
  void Invalidate(u32 addr);
  void Init();
  void Reset();
  void DoState(PointerWrap& p);
};
}  // namespace PowerPC
